package org.ch03.test06;

import java.util.ArrayList;
import java.util.List;

/**
 * 型变
 * 1)不变 : 赋值运行符左右两边的泛型必须一致
 * 2)协变 : 子类型的泛型可以赋值给父类型的泛型 - 通配符 - <? extends T>
 * 3)逆变 : 父类型的泛型可以赋值给子类型的泛型 - 通配符 - <? super T>
 *
 * @author ZQX
 * @date 2025-03-27
 */
public class MainTest04 {
    public static void main(String[] args) {
        // List<Dog> list = new ArrayList<Animal>();

        // 泛型的逆变性 - 应用场景：只写不读
        List<? super Dog> list = new ArrayList<Animal>();

        // 泛型的逆变中，可以调用带有泛型参数的方法，与协变不一样的地方
        list.add(new Dog());
        list.add(new Dog());
        list.add(new Dog());

        System.out.println(list.size());

        // 但是，不能读数据
        // Dog dog = list.get(0);

        // 解决一：强制转换
        Dog dog = (Dog) list.get(0);

        // 解决二：强制转换
        Object obj = list.get(0);
    }
}
